home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / docs / corsoguide / gadgets-18.txt < prev    next >
Text File  |  1992-09-03  |  28KB  |  462 lines

  1. I gadgets
  2.  
  3. Nel mezzo del cammin del nostro corso su Intuition siamo giunti ad uno
  4. degli argomenti più importanti: i gadget. I bottoni, come vengono solitmante
  5. tradotti, sono dei pulsanti sullo schermo: l'utente infatti posizionandosi
  6. su di essi (identificati normalmente come rettangoli con aspetto 3D) e
  7. cliccando con il mouse attiva un'operazione, proprio come un pulsante;
  8. esistono due diverse categorie di gadget: di sistema e dell'applicazione; i
  9. primi li abbiamo già visti e utilizzati, sono infatti quelli già definiti
  10. dal sistema (gadget di profondità, di cambiamento di grandezza, di chiusura
  11. ecc.), i secondi sono definiti ed usati interamente dall'applicazione. I
  12. gadget possono essere divisi anche in quattro tipi, a seconda del
  13. funzionamento e delle caratteristiche:
  14.  
  15. Gadget booleani (o bottoni)
  16. Sono gadget che funzionano semplicemente cliccandovi sopra e che una volta
  17. selezionati eseguono un'operazione.
  18.  
  19. Gadget proporzionali
  20. Questo tipo di gadget sono come delle manopole che permettono di indicare
  21. uno fra diversi possibili valori; ad esempio gli slider per posizionare
  22. l'immagine nel MultiView.
  23.  
  24. Gadget stringa
  25. Sono gadget che, venendo selezionati dall'utente, permettono di inserire un
  26. testo.
  27.  
  28. Gadget custom
  29. I gadget custom sono una forma più generale di gadget che permettono di
  30. realizzare diversi tipi di funzioni e quindi risultano più flessibili di
  31. quelli visti.
  32.  
  33. Ogni gadget viene attivato quando l'utente clicca all'interno di una precisa
  34. regione specificata dall'applicazione, denominata select box; quando il
  35. gadget viene selezionato la sua immagine cambia per indicare all'utente di
  36. essere stato attivato; questa operazione viene denominata highlighting; un
  37. gadget può essere abilitato (quindi utilizzabile dall'utente) o disabilitato
  38. (quindi non utilizzabile); la disabilitazione viene indicata all'utente
  39. mediante il mascheramento del gadget con un pattern a griglia.
  40. Un gadget di applicazione viene creato dichiarando ed inizializzando la
  41. struttura Gadget definita in "intuition/intuition.h"; Intuition avvisa
  42. l'applicazione sulla seleziona da parte dell'utente di un suo gadget
  43. mediante IDCMP_GADGETUDOWN e IDCMP_GADGETUP; il primo messaggio viene
  44. inviato appena l'utente seleziona con il pulsante sinistro del mouse il
  45. gadget, il secondo viene invece inviato quando l'utente rilascia il pulsante
  46. sul gadget; ambedue i messaggi hanno memorizzato nel campo IAddress
  47. l'indirizzo del gadget che è stato attivato.
  48. I gadget appaiono sempre in una finestra o in un requester; possono essere
  49. creati all'apertura della finestra, o essere inseriti e rimossi
  50. successivamente; possono essere posti in un qualsiasi punto della finestra,
  51. anche sui bordi; la finestra, all'apertura, modifica automaticamente la
  52. grandezza dei bordi per contenere interamente i gadget inseriti su essi; la
  53. grandezza di un gadget può essere fissa o relativa alla grandezza della
  54. finestra; la posizione di un gadget è normalmente relativa per la cordinata
  55. x al bordo sinistro e per la cordinata y al bordo superiore della finestra,
  56. ma può essere relativa anche agli altri bordi.
  57. Per creare una serie di gadget da agganciare alla finestra occorre definire
  58. e inizializzare una serie di strutture Gadget, facendo bene attenzione di
  59. prole in lista mediante il puntatore NextGadget, esempio:
  60.  
  61. struct Gadget MioGad1 = { NULL, ... };
  62. struct Gadget MioGad2 = { &MioGad1, ... };
  63. struct Gadget MioGad3 = { &MioGad2, ... };
  64.  
  65. In realtà non risulta necessario porli in lista se si desidera inserirli o
  66. rimuoverli nella finestra una volta aperta, individualmente (vale a dire uno
  67. per volta) mediante AddGadget() e RemoveGadget(); se si desidera però
  68. inserirli tutti insieme o all'apertura della finestra o successivamente,
  69. occorre metterli in lista così come mostrato e far riferimento al primo
  70. elemento di quest'ultima che, nel nostro caso è MioGadg3 (attenzione è
  71. MioGad3 che punta a MioGad2 il quale punta a sua volta a MioGad1 che
  72. interrompe la lista con NULL); per inserirli all'apertura della finestra
  73. bisogna porre il puntatore al primo gadget della lista nel tag WA_Gadget in
  74. OpenWindowTagList; se desiderate inserirli o rimuoverli successivamente
  75. all'apertura della finestra bisogna utilizzare la funzione
  76.  
  77. pos = AddGList(finestra,gadget,posizione,numgad,requester);
  78.  
  79. dove "finestra" è il puntatore alla finestra in cui inserire i gadgets;
  80. "gadget" è il puntatore al primo gadget della lista; "posizione" è la
  81. posizione nella lista generale dei gadgets della finestra o del requester,
  82. in cui inserire i gadget (con ~0 si inseriscono i gadgets alla fine della
  83. lista); "numgad" è il numero di gadgets da inserire; "requester" è il
  84. puntatore al requester in cui inserire i gadgets (se non è utilizzato
  85. "finestra"); il valore ritornato "pos" indica la posizione in cui i gadgets
  86. sono stati inseriti nella lista generale.
  87. Per rimuivere una lista di gadgets occorre utilizzare la funzione
  88.  
  89. pos = RemoveGList(finestra,gadget,numgad);
  90.  
  91. dove i parametri assumono gli stessi significati descritti in AddGList()
  92. eccetto che per "pos" che indica la posizione del primo gadget della lista
  93. che è stato rimosso (vale -1 se il gadget non è stato trovato).
  94. Non bisogna mai modificare gli attributi dei gadgets mentre sono inseriti
  95. nella finestra; bisogna rimuoverli, modificarli e poi reinserirli con le
  96. funzioni appena viste.
  97. Ogni gadget è solitamente identificato con un'immagine in modo che l'utente
  98. possa riconoscerlo e attivarlo; intuition permette di associare ad un gadget
  99. una serie di informazioni grafiche in diversi modi; il programmatore può
  100. decidere se utilizzare come immagine del gadget, un'immagine bitmap; in
  101. questo caso bisogna inizializzare una struttura Image con i bitmap
  102. dell'immagine, inserirne l'indirizzo nel campo GadgetRender della struttura
  103. Gadget del gadget da creare, e impostare il flag GFLG_GADGIMAGE nel campo
  104. Flags sempre della struttura Gadget. Un'alternativa all'utilizzo
  105. dell'immagine bitmap consiste nell'utilizzo di un bordo; con bordo si
  106. intende una serie di linee che possono avere diverso colore; solitamente
  107. questa tecnica viene utilizzata per creare i "bordi" del gadget e per
  108. utilizzarla bisogna inizializzare una struttura Border con i dati delle
  109. linee, passare il puntatore della struttura nel campo GadgetRender del
  110. gadget e non impostare il flag GFLG_GADGIMAGE (da questo si capisce che i
  111. bordi e le immagini non possono essere utilizzati insieme). Ad ogni gadget
  112. può essere associato insieme ad una delle due forme grafiche appena viste,
  113. un testo; per far questo bisogna inizializzare la struttura IntuiText con
  114. il testo e passarne l'indirizzo nel campo GadgetText del gadget. Il
  115. programmatore può decidere anche di non associare alcun grafico o testo al
  116. gadget, perché l'applicazione possiede già informazioni grafiche
  117. sufficienti o perché potrebbe non averne bisogno; un classico esempio
  118. consiste in un editor di testi, dove viene utilizzato un unico gadget che
  119. copra tutta la finestra testo; in questo modo l'applicazione viene avvisata
  120. quando l'utente clicca nella finestra testo e può agire di conseguenza
  121. (riposizionare il cursore o selezionare un blocco di testo).
  122. Normalmente quando l'utente seleziona un gadget, questo cambia la propria
  123. immagine per indicare di essere in fase di selezione (fase di Highlighting);
  124. ci sono diversi modi per realizzare la fase grafica di selezione:
  125. - Evidenziazione mediante complemento del colore
  126. - Evidenziazione disegnando un box
  127. - Evidenziazione mediante un'altra immagine o bordo
  128. - Nessuna evidenziazione
  129. L'evidenziazione mediante il complemento del colore, consiste
  130. nell'invertire bit a bit il codice dei colori del rettangolo di selezione;
  131. questa tecnica si ottiene attivanno il flag GFLG_GADGHCOMP nel campo Flags
  132. e risulta molto semplice da utilizzare; se i colori vengono impostati
  133. oculatamente l'effetto grafico può risultare qualitativamente elevato.
  134. L'evidenziazione mediante il disegno di un box, consiste nel far disegnare
  135. ad intuition un rettangolo che contorni il gadget; questa evidenziazione si
  136. attiva impostando il flag GFLG_GADGHBOX nel campo Flags.
  137. L'evidenziazione mediante immagine o bordo consiste nell'utilizzare un'altra
  138. immagine (se il disegno del gadget era costituito da un'immagine) o un altro
  139. bordo (se il rendering del gadget era un bordo) che indichino l'immagine
  140. selezionata; ovviamente bisogna inizializzare le relative strutture (Image
  141. nel primo caso e Border nel secondo) e passare il relativo puntatore nel
  142. campo SelectRender del gadget; bisogna anche specificare il flag
  143. GFLG_GADGHIMAGE nel campo Flags.
  144.  
  145. Grandezza e posizione del gadget
  146.  
  147. La posizione e le dimensioni del box di selezione del gadget sono definite
  148. dai campi LeftEdge, TopEdge, Width e Height del gadget, che indicano la
  149. posizione in pixels relativa ai bordi della finestra, e l'ampiezza e altezza
  150. sempre in pixels. L'immagine ed il testo del gadget sono sempre relativi alla
  151. posizione del gadget, per cui spostando quest'ultimo anche la sua immagine
  152. lo seguirà; la grandezza dell'immagine non è relativa alla grandezza del
  153. gadget, per cui se la dimensione del gadget viene modificata, bisogna
  154. effettuare il cambiamento nell'immagine oppure utilizzare un gadget BOOPSI.
  155. Come sopra accennato, la posizione è relativa ai bordi della finestra;
  156. normalmente LeftEdge è relativo al bordo sinistro (quindi si utilizzano
  157. valori positivi) e TopEdge è relativo al bordo superiore (si utilizzano
  158. valori positivi); vi è però la possibilità di rendere la posizione relativa
  159. verso gli altri bordi (un gadget che fa comunemente uso di ciò è quello di
  160. cambiamento della grandezza della finestra, che si trova sempre in basso a
  161. destra); se si vuole rendere LeftEdge relativo al bordo di destra (quindi
  162. si usano normalmente valori negativi) bisogna impostare il flag
  163. GFLG_RELRIGHT nel campo Flags; per rendere TopEdge relativo al bordo
  164. inferiore (si utilizzano valori negativi) si deve impostare il flag
  165. GFLG_RELBOTTOM nel campo Flags. Normalmente le dimensioni sono fisse, ma
  166. possono essere rese relative alla grandezza della finestra; bisogna
  167. impostare il flag GFLG_RELWIDTH per rendere l'ampiezza del gadget relativa
  168. all'ampiezza della finestra e GFLG_RELHEIGHT per fare lo stesso con
  169. l'altezza (possono anche essere usati singolarmente); il sistema per
  170. calcolare l'ampiezza (o altezza) del gadget, consiste nel sommare il valore
  171. del campo Width (o Height) del gadget con il valore dell'ampiezza (o
  172. altezza) della finestra; in tal caso si utilizzano normalmente valori
  173. negativi.
  174. Si può decidere di posizionare i gadget sui bordi della finestra;
  175. in questa evenienza il sistema dimensionerà opportunamente la grandezza del
  176. bordo, per contenere tutti i gadget presenti sullo stesso; per indicare ad
  177. Intuition quali gadget si trovano sui bordi e di quali bordi si tratta,
  178. bisogna impostare i flags GACT_RIGHTBORDER (il gadget è nel bordo destro),
  179. GACT_LEFTBORDER (bordo sinistro), GACT_TOPBORDER (bordo superiore),
  180. GACT_BOTTOMBORDER (bordo inferiore) nel campo Activation del gadget.
  181. Attenzione che Intuition adatterà la grandezza dei bordi solo all'apertura
  182. della finestra; per cui i gadget per i bordi devono gia essere tutti
  183. presenti nella lista dei gadgets passata ad OpenWindowTagList e se
  184. venissero aggiunti o rimossi successivamente, Intuition non modificherà la
  185. grandezza dei bordi. Alcune volte può capitare che il bordo non copra a
  186. livello grafico tutti i gadgets sui bordi, per ovviare a questo
  187. inconveniente basta creare un gadget "fantasma" (vale a dire senza immagine
  188. e che non serve a nulla) posto sul bordo e inserirlo in fondo alla lista
  189. dei gadget e, modificandone posizione e grandezza si potrà controllare la
  190. dimensione del bordo; si consiglia di rendere relativi al bordo destro i
  191. gadget presenti su tale bordo, e di rendere relativi al bordo inferiore i
  192. gadget presenti sullo stesso bordo; i gadget potrebbo essere presenti su
  193. due bordi contemporaneamente (se il gadget è in un angolo della finestra)
  194. per cui possono essere attivati due GACT_xxxBORDER adiacenti.
  195. Come in ogni altro mezzo di comunicazione di Intuition anche i Gadget
  196. indicano all'applicazione di essere stati attivati mediante messaggi IDCMP;
  197. possiamo avere due comunicazioni, una indicante che l'utente ha selezionato
  198. (ma non rilasciato) il gadget (IDCMP_GADGETDOWN) e l'altra in cui l'utente
  199. lo ha rilasciato (IDCMP_GADGETUP); oltre ad indicare ad Intuition quali dei
  200. due tipi (o tutte e due) di messaggi ricevere, bisogna indicare per ogni
  201. singolo gadget quale azione deve compiere quest'ultimo una volta
  202. selezionato; impostando il flag GACT_IMMEDIATE nel campo Activation del
  203. gadget, Intuition invierà un IDCMP_GADGETDOWN all'applicazione quando
  204. l'utente selezionerà il gadget; impostando il flag GACT_RELVERIFY sempre
  205. nel campo Activation, Intuition invierà il messaggio IDCMP_GADGETUP
  206. all'applicazione quando l'utente rilascierà il gadget; se l'utente muove il
  207. puntatore al di fuori del gadget (mentre è attivato) e rilascia il
  208. pulsante, Intuition invierà un messaggio di tipo IDCMP_MOUSEBUTTONS. Per
  209. comprendere quale gadget ha generato il messaggio, basta controllare il
  210. campo IAddress di IntuiMessage, in cui è contenuto l'indirizzo della
  211. struttura Gadget del gadget che ci interessa; una volta ottenuto tale
  212. puntatore, si controlla il contenuto del campo GadgetID del gadget che
  213. contiene il codice identificatore di quest'ultimo, anche se basterebbe il
  214. semplice indirizzo (attenzione, prelevare il GadgetID solo quando si è
  215. certi che il messaggio è di tipo IDCMP_GADGETDOWN o IDCMP_GADGETUP).
  216. Vi è la possibilità di essere informati sullo spostamento del mouse, mentre
  217. un gadget è selezionato; questo può risultare utile in caso di gadget
  218. proporzionali o in altri casi particolari; per essere ratificati di
  219. spostamenti del mouse, bisogna attivare il flag GACT_FOLLOWMOUSE nel campo
  220. Activation del gadget; Intuition invierà messaggi di tipo IDCMP_MOUSEMOVE
  221. ad ogni movimento del mouse (in questo tipo di messaggi non viene
  222. memorizzato il codice del gadget, quindi non lo si deve prelevare); nel
  223. caso di gadget booleani bisogna sempre specificare GACT_RELVERIFY per
  224. essere informati dei movimenti del mouse.
  225.  
  226. Attivazione e disattivazione dei gadgets
  227.  
  228. Un gadget può essere disattivato (quindi non utilizzabile dall'utente) con
  229. effetto a video indicato da un pattern a scacchiera che si sovrappone
  230. all'immagine del gadget; l'applicazione può indicare di aprire dei gadget
  231. già deselezionati, mediante GFLG_DISABLED; durante tutto il periodo di
  232. attività non possono essere attivati o disattivati agendo su questo flag,
  233. ma devono essere utilizzate le seguenti funzioni:
  234.  
  235. OnGadget(gadget, finestra, requester);
  236. OffGadget(gadget, finestra, requester);
  237.  
  238. Dove gadget è il puntatore alla struttura gadget del gadget da abilitare o
  239. disabilitare; finestra è il puntatore alla finestra a cui il gadget è
  240. agganciato; requester è il puntatore al requester se il gadget è invece
  241. agganciato ad un requester.
  242.  
  243. I gadget booleani
  244.  
  245. Torniamo a prlare di gadgets booleani, in realtà avete già tutti gli elementi
  246. per crearli ma mancano ancora alcuni aspetti; come già detto i gadget
  247. booleani sono come dei bottoni che implementano operazioni del tipo ON/OFF
  248. o Si/No; selezionandone uno questo funziona come un pulsante che attiverà
  249. un'operazione; vi è la possibilità di utilizzarli come "interruttori" cioè
  250. come indicatori di uno stato attivo/disattivo impostando GACT_TOGGLESELECT
  251. nel campo Activation della struttura Gadget, ma questo è stato già visto.
  252. La caratteristica non ancora spiegata è il mascheramento (naturalmente non
  253. quello carnevalesco); normalmente il gadget ha forma rettangolare e le
  254. operazioni di selezione e di illuminazione (highlighting) vengono impostate
  255. su questa zona rettangolare; può accadere di volere forme diverse da quella
  256. rettangolare (come quella ovale) e per questo è stato realizzato il
  257. mascheramento; nel mascheramento il programmatore mette a disposizione di
  258. intuition una maschera (immagine di un bitplane della stessa grandezza del
  259. gadget) dove i bit ad 1 indicano i pixels effettivamente appartenenti al
  260. gadget; il mascheramento funziona per la selezione (se l'utente clicca sul
  261. gadget in un punto in cui la maschera è 0, allora intuition non selezionerà
  262. il gadget) e per l'illuminazione a complemento (il complemento dei bit
  263. dell'immagine verrà realizzato solo per quelli in cui la maschera ha 1), il
  264. mascheramento non funziona però per l'immagine; questo vuol dire che nel
  265. rinfresco dell'immagine verrà ridisegnato tutto il rettangolo andando
  266. incontro in alcuni casi ad effetti non voluti (se piazziamo il gadget ovale
  267. su un'immagine si osserveranno anche i quattro angoli del box del gadget).
  268. Per attivare il mascheramento bisogna inizializzare una struttura BoolInfo,
  269. il cui puntatore dovrà essere inserito nel campo SpecialInfo del gadget, e
  270. si dovrà attivare il flag GACT_BOOLEXTEND nel campo Activation sempre del
  271. gadget.
  272. Altra applicazione che potreste trovarvi davanti è la mutua
  273. esclusione dei gadgets; vale a dire una serie di gadget di tipo
  274. ToggleSelect raggruppati insieme, in cui la selezione di uno comporta la
  275. deselezione di tutti gli altri (necessario quando bisogna selezionare uno
  276. solo di una serie di serie di stati); questo tipo di applicazione non è
  277. gestita da intuition, per cui il programmatore dovrà arrangiarsi; ma non vi
  278. preoccupate perché arriva Zorro III il programmatore mascherato che vi
  279. salva e vi spiegherà come fare! I passi per implementare la mutua
  280. esclusione dei gadgets sono i seguenti:
  281. - i gadgets vanno creati di tipo ToggleSelect (impostando il flag
  282.   GACT_TOGGLESELECT nel campo Action), con attivazione del solo tipo
  283.   GACT_IMMEDIATE (non utilizzare quindi GACT_RELVERIFY), in tal maniera si
  284.   gestiscono solo eventi IDCMP_GADGETDOWN
  285. - per l'illuminazione dei gadgets utilizzate una delle tecniche già viste
  286. - al verificarsi di un evento IDCMP_GADGETDOWN, dovranno essere rimossi i
  287.   gadgets del blocco con un RemoveGList(), dovranno venir aggiustati gli
  288.   stati di selezione mediante GFLF_SELECTED, quindi riagganciare i gadgets
  289.   alla finestra mediante AddGList() e rivisualizzarli con RefreshGList().
  290.  
  291. I gadget proporzionali
  292.  
  293. Spieghiamo ora come realizzare i gadget proporzionali; come già descritto la
  294. volta scorsa i gadget proporzionali permettono di specificare un valore in
  295. un possibile range, funzionano un po' come le manopole a slitta del volume
  296. di una radio; i gadget proporzionali sono costituiti da un contenitore (la
  297. cui grandezza corrisponde a quella del gadget) e da una manopola (knob) che
  298. scorre all'interno del contenitore; cliccando sulla manopola è possibile
  299. spostarsi fluidamente da un punto all'altro del range dei possibili valori;
  300. cliccando fuori dalla manopola ma sempre nel contenitore, si implementano
  301. spostamenti in blocco; i gadget proporzionali possono muoversi sull'asse x,
  302. y o entrambi e i movimenti hanno un limite teorico di 65536 posizioni, ma
  303. sono sempre limitati alla risoluzione dello schermo.
  304. Le applicazioni "logiche" dei gadget proporzionali sono sostanzialmente 2; la
  305. prima (denominata scroller) in cui si mostra normalmente un numero limitato
  306. di informazioni rispetto ad una grande quantità di dati; pensate ad esempio
  307. ad un text-editor, in tal caso la manopola rappresenta la posizione e la
  308. grandezza della "finestra" in cui vengono visualizzate le informazioni; in
  309. questo tipo di applicazione è importante anche la grandezza della manopola,
  310. perché rende l'idea della proporzione fra i dati visualizzati e quelli
  311. effettivamente disponibili. La seconda applicazione (denominata slider)
  312. impiega i gadget proporzionali per scegliere uno tra una serie di possibili
  313. valori (pensate alla manopola per il volume o per la scelte di una
  314. componente del colore).
  315. I due casi sono sostanzialmente differenti dal punto di vista del
  316. programmatore, nel primo infatti la manopola rappresenta un insieme
  317. di dati ma permette di spostarsi ugualmente di uno in uno, nel seconodo
  318. invece la manopola seleziona un solo elemento di una serie; tutti e due
  319. i casi sono realizzabili dai gadget proporzionali di Intuition, anzi se
  320. notate bene il secondo è un caso particolare del primo (basta impostare
  321. il numero di elementi visualizzati ad 1).
  322. Per realizzare un gadget proporzionale bisogna inizializzare una struttura
  323. ausiliaria, PropInfo il cui puntatore va inserito nel campo SpecialInfo del
  324. gadget; il primo campo da inizializzare è Flags, in cui è possibile
  325. specificare se non disegnare il bordo del gadget (PROPBORDERLESS, viene
  326. visualizzata solo la manopola); l'applicazione può specificare una propria
  327. immagine per la manopola o farne utilizzare una standard da Intuition
  328. (AUTOKNOB, l'immagine standard della manopola varia la propria grandezza in
  329. funzione di HorizBody e VertBody quindi risulta molto efficiente); bisogna
  330. comunque fornire una struttura Image anche se specificato AUTOKNOB (anche
  331. se in questo caso non c'è bisogno di inizializzare la struttura perché
  332. viene totalmente gestita da Intuition); la struttura Image non può essere
  333. condivisa da altri gadget proporzionali. Bisogna indicare in che direzione
  334. si può muovere la manopola, orizzontalmente (FREEHORIZ) e/o verticalmente
  335. (FREEVERT); anche i gadget proporzionali come tutto il resto del sistema
  336. ha cambiato il suo look in uno 3D molto più accattivante, per attivarlo
  337. (fatelo sempre) utilizzare il flag PROPNEWLOOK.
  338. Altre variabili del PropInfo da inizializzare sono HorizPot e VertPot che
  339. indicano la posizione della manopola; questi valori vanno da 0 (posizione
  340. minima) a MAXPOT-body (posizione massima), dove body è la grandezza della
  341. manopola (che equivale al numero di elementi visualizzati) per cui occorre
  342. effettuare una proporzione per calcolare il giusto valore:
  343.  
  344. pot = ((val - minval) * MAXPOT) / ((maxval - minval) - numval);
  345.  
  346. dove minval è il valore minimo che la manopola può assumere, maxval è il suo
  347. valore massimo, numval è il numero di elementi visualizzati; val è il valore
  348. attualmente assunto dalla manopola e pot è il valore da inserire in HorizPot
  349. e/o VertPot; vediamo un esempio per fissare meglio l'idea: immaginiamo che
  350. la manopola debba specificare la componente Rosso (range 0 - 255) con un
  351. valore iniziale di 170:
  352.  
  353. UWORD pot;
  354. struct PropInfo PI;
  355.   .
  356.   .
  357. pot = ((170 - 0) * MAXPOT) / ((255 - 0) - 1);
  358. PI.HorizPot = pot; /* e, oppure */
  359. PI.VertPot = pot;
  360.  
  361. La conversione va fatta naturalmente anche quando bisogna leggere il
  362. valore della posizione in HorizPot o VertPot per sapere quale elemento (o
  363. gruppo) è stato selezionato con il gadget; la formula è la seguente:
  364.  
  365. val = (pot * ((maxval - minval) - 1)) / MAXPOT + minval;
  366.  
  367. dove pot è il valore prelevato da HorizPot o VertPot e le altre variabili
  368. assumono lo stesso significato prima descritto; verifichiamo l'esempio
  369. precedente:
  370.  
  371. UBYTE Red;
  372. struct PropInfo PI;
  373.   .
  374.   .
  375. Red = (PI.Horiz.Pot * ((255 - 0) - 1)) / MAXPOT + 0;
  376.  
  377. Gli altri due campi da inizializzare ed usare sono HorizBody e VertBody che
  378. indicano l'ampiezza e l'altezza della manopola; se è stato specificato
  379. AUTOKNOB nel campo Flags, l'immagine della manopola cambierà la propria
  380. dimensione in base a questi campi; come i Pot anche i Body variano da 0 a
  381. MAXBODY, per cui bisogna utilizzare delle proporzioni simili a quelle viste:
  382.  
  383. body = (numval * MAXBODY) / (maxval - minval);
  384.  
  385. dove numval è il numero di elementi o range visualizzato.
  386. Le formule prima citate valgono sia per gli scrollers che per gli sliders,
  387. bisogna fare attenzione che nel primo caso "val" (l'elemento puntato dalla
  388. manopola) indichi il primo elemento visualizzato nella pagina, mentre per
  389. gli sliders occorre utilizzare come numval 1.
  390. Per creare un gadget proporzionale occorre specificare GTYP_PROPGADGET nel
  391. campo GadgetType della struttura Gadget e inserire il puntatore alla
  392. struttura PropInfo nel campo SpecialInfo della struttura Gadget; ripetieamo
  393. che quando si utilizza AUTOKNOB, bisogna far attenzione ad inserire
  394. l'indirizzo di una struttura Image creata (non c'è bisogno di inizializzarla
  395. e gestirla, in quanto questo sarà compito di Intuition) nel campo
  396. GadgetRender della struttura Gadget (attenzione a non impostare il flag
  397. GFLG_GADGIMAGE). Per utilizzare una propria immagine basta semplicemente non
  398. specificare AUTOKNOB nel PropInfo ed indicare GFLG_GADGIMAGE nel Gadget; se
  399. si vuole inoltre utilizzare l'immagine per l'illuminazione o selezione del
  400. gadget bisogna impostare il flag GFLG_GADGHIMAGE e fornire il puntatore alla
  401. struttura Image (che deve avere stesse dimensioni di quella per l'immagine
  402. non selezionata).
  403. Per modificare i valori (flag, posizione e grandezza della manopola) senza
  404. bisogno di staccare il gadget dal sistema, si utilizza la funzione
  405. NewModifyProp():
  406.  
  407. NewModifyProp(gadget,finestra,requester,flags,horizpot,vertpot,horizbody,vertbody,numgad);
  408.  
  409. dove gadget è il gadget proporzionale di cui cambiare i valori, finestra è il
  410. puntatore alla finestra in cui il gadget è inserito, requester è il puntatore
  411. al requester se invece il gadget è inserito in un requester, flags, horizpot,
  412. vertpot, horizbody, vertbody sono i nuovi valori del PropInfo; numgad è il
  413. codice di posizione in cui reinserire il gadget dopo che è stato deinserito
  414. e aggiornato dalla funzione; si può impostare questo valore a tutti 1 (dato
  415. che è un long quindi il valore è 0xFFFFFFFF) e in questa maniera, la
  416. funzione aggiornerà le parti dell'immagine che sono effettivamente modificate,
  417. ciò risulta notevolmente più veloce quindi è consigliabile.
  418.  
  419.  
  420. I gadget stringa
  421.  
  422. I gadget stringa permettono di inserire una stringa di caratteri; una
  423. volta selezionato il gadget, intuition visualizzerà il cursore per inserire
  424. nuovi caratteri; il cursore può essere spostato con i tasti cursore e con
  425. l'intervento del mouse; quando l'utente preme il tasto RETURN o ENTER
  426. oppure seleziona da qualche altra parte, allora il gadget è deselezionato.
  427. Quando l'utente preme RETURN o ENTER viene generato un messaggio di tipo
  428. IDCMP_GADGETUP se era specificato GACT_RELVERIFY; se il gadget viene
  429. deselezionato cliccando altrove, allora non viene generato nessun messaggio
  430. IDCMP_GADGETUP. Il gadget può permettere di inserire anche solo un valore
  431. numerico a 32 bit segnato(gadget stringa Integer); per impostare il gadget
  432. stringa di tipo Integer, bisogna impostare il flag GACT_LONGINT nel campo
  433. Activation del gadget; il valore numerico inserito è presente nel campo
  434. LongInt della struttura StringInfo associata al gadget stringa.
  435. E' possibile attivare il gadget stringa da applicazione mediante la funzione:
  436.  
  437. BOOL ActivateGadget(gadget, finestra, requester);
  438.  
  439. dove gadget è il gadget stringa da attivare, finestra è il puntatore alla
  440. finestra a cui appartiene e requester è il puntatore al requester se il gadget
  441. è inserito in un requester. Non è detto che l'operazione possa avere successo;
  442. questo perché nel frattempo il sistema potrebbe essere impegnato con un menù o
  443. con altre operazioni; se l'operazione di attivazione ha successo, allora
  444. ActivateGadget() ritorna TRUE e FALSE altrimenti.
  445. Vi è la possibilità dalla V37 del sistema, di passare da un gadget
  446. stringa ad un altro premendo TAB o SHIFT+TAB; per abilitare il vostro
  447. gadget stringa ad entrare in questo ciclo di selezione, occorre inserire
  448. il flag GFLG_TABCYCLE; l'ordine di selezione sarà determinato dalla
  449. posizione dei gadgets nella lista; se un gadget viene deselezionato
  450. con un TAB, Intuition invierà un messaggio IDCMP_GADGETUP all'applicazione
  451. (come se si fosse premuto RETURN o ENTER); per capire che la deselezione è
  452. dovuta alla pressione del tasto TAB, si può controllare il campo Code del
  453. messaggio che conterrà il valore 0x09 (il codice ASCII del TAB). Per
  454. realizzare un gadget stringa, bisogna inizializzare una struttura
  455. StringInfo, passarne l'indirizzo nel campo SpecialInfo del gadget e
  456. specificare il flag GTYP_STRGADGET nel campo GadgetType; l'applicazione può
  457. indicare l'allineamento della stringa, mediante GACT_STRINGLEFT,
  458. GACT_STRINGCENTER o GACT_STRINGRIGHT. Per il rendering del gadget stringa,
  459. si può utilizzare uno qualsiasi dei metodi visti, mentre per
  460. l'illuminazione si deve specificare necessariamente il complemento
  461. (GFLG_GADGHCOMP).
  462.